define(["SzLib", "SzSns", "jquery", "jquery.json"], function(SzLib, SzSns) {

    /**
     * Facebook implementation of SzSns.
     */
    var SzSnsOgz = function() {
        // Call the parent constructor
        SzSns.call(this);
        if (SZ.PLATFORM == 'ogz') {
            // post callback
            OGZ.addCallback('post', function (data) {
                //callBack function
                $("#gameSwf").removeClass("hideSwf");
                $("#gameImage").html("").hide();
                SZ.APP.callAsFunc("sendFeedCallBack", [data]);
                SzLib.log(data);
            });

            // request callback
            OGZ.addCallback('request', function (success, data) {
                SzLib.log('*****************************');
                SzLib.log('request response success:[' + success + ']');
                SzLib.log('request response data:' + JSON.stringify(data));
                $("#gameSwf").removeClass("hideSwf");
                $("#gameImage").html("").hide();
                if (data.length !== 0) {
                    SzLib.log('get data');
                    SZ.APP.callAsFunc("sendRequestCallBack", data);
                } else {
                    SzLib.log('data = undefined');
                    // do nothing
                    // SZ.APP.callAsFunc("sendRequestCallBack", ['false']);
                }
            });

            // payment callback
            OGZ.addCallback('payment', function (success, data) {
                SzLib.log('*****************************');
                SzLib.log('request response success:'+   typeof(success) + '[' + success + ']');
                SzLib.log('request response data:'+   typeof(data) + '[' + JSON.stringify(data)+ ']');

                if ($("#gameShadow").is(":hidden")) {
                    $("#gameSwf").removeClass("hideSwf");
                    $("#gameImage").html("").hide();
                }
                var addParams = {
                    "token": SZ.TOKEN,
                    "dev": SzLib.getUrlParam('dev')
                };

                // payment process success
                if (success === true) {
                    SzLib.log('*****************************');
                    SzLib.sendSzReq(
                        ["page.index", []],
                        function(r) {
                            SzLib.log(r);
                            SZ.APP.paymentSucceed(r);
                        },
                        function(r) {
                            SzLib.log(r);
                        },
                        $.extend(addParams, {
                            "act": "complete",
                            "res": data.platform_response,
                            "auth_key": SZ.PF_TOKEN,
                            "viewer_id": SZ.PLATFORM_ID,
                            "token": SZ.TOKEN
                        }),
                        SZ.IS_COMPRESS
                    );
                }
            });
        }
    };
    // inherit SzSns
    SzSnsOgz.prototype = new SzSns();
    // correct the constructor pointer because it points to SzSns
    SzSnsOgz.prototype.constructor = SzSnsOgz;


    //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-9-
    //-* API Function Overwrites
    //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
    /**
     * 获取玩家信息
     *
     * @see SzSns.prototype.getUserInfo
     */
    SzSnsOgz.prototype.getUserInfo = function(platformId, callback) {
        OGZ.callAPI('/users/current/', {}, function (r) {
            //SzLib.log(JSON.stringify(r));
            var response = r.data;
            var userInfo = {
                id: response.uid,
                snid: response.snid,
                platform: response.platform,
                name: response.name,
                gender: response.sex,
                locate: '',
                profile_image_url: response.pic,
                timezone: '',
                email: '',
                first_name: response.first_name,
                last_name: response.last_name
            };

            SZ.APP.callAsFunc("setUserInfo", userInfo);
                 if (typeof callback == 'function') {
                     callback(userInfo);
                 }
            return userInfo;
        });
    };

    /**
     * 获取复数玩家信息
     *
     * @see SzSns.prototype.getUserInfos  30643 30647
     */
    SzSnsOgz.prototype.getUserInfos = function(platformIds, callback) {
        SzLib.log('platformIds:' + JSON.stringify(platformIds));
        OGZ.callAPI('/users', {'uids': platformIds}, function (r) {
            SzLib.log('R:' + JSON.stringify(r));

            var userInfos = {};
                 if (typeof r === 'object' && r.success === true) {
                     $.each(r.data, function(key, friendInfo) {
                         platformId = friendInfo.uid;
                         if (platformId != SZ.PLATFORM_ID) {
                             userInfos[platformId] = {
                                 id: platformId,
                                 name: friendInfo.first_name  + ' ' + friendInfo.last_name,
                                 profile_image_url: friendInfo.pic
                             };
                         }
                     });
                 }
                 SZ.APP.callAsFunc("setUserInfos", userInfos);
                 if (typeof callback == 'function') {
                     callback(userInfos);
                 }
                SzLib.log('userInfos:' + JSON.stringify(userInfos));
                return userInfos;
        });
    };

    /**
     * 获取好友列表信息
     *
     * @see SzSns.prototype.getFriends
     */
    SzSnsOgz.prototype.getFriends = function(platformId, callback) {
        OGZ.callAPI('/users/current/friends',{}, function (r) {
            SzLib.log(JSON.stringify(r));
            var userInfos = {};
            var response = r.data;
            if (typeof response === 'object') {
                $.each(response, function (key, friendInfo) {
                    userInfos[friendInfo.uid] = {
                        id: friendInfo.uid,
                        app_user: friendInfo.app_user,
                        name: friendInfo.first_name + ' ' + friendInfo.last_name,
                        profile_image_url: friendInfo.pic
                    };
                });
            }
            SZ.APP.callAsFunc("setFriendList", userInfos);
            if (typeof callback == 'function') {
                callback(userInfos);
            }

            return userInfos;
        });
    };

    /**
     * 获取玩家access token的接口
     *
     * @see SzSns.prototype.getAccessToken
     */
    SzSnsOgz.prototype.getAccessToken = function() {
        return null;
    };

    /**
     * 获取玩家本地化支付，现金单位与汇率的接口
     *
     * @see SzSns.prototype.getCurrency
     */
    SzSnsOgz.prototype.getCurrency = function(params, callback) {
        var r = {
            currency : {
                usd_exchange_inverse: 9, // 美元兑卢布，固定1:65  美元兑 votes 1:6
                user_currency: ' Голосов'
            }
        };
        SZ.APP.callAsFunc("setCurrency", r);
        callback(params, r);
    };

    /**
     * 服务器生成好feedId和link后，前端调用sendFeed接口，当真正发布feed后，在回调函数中调用as接口，
     * 前端记录已发送feed的类型，并调用后端接口，将feedId传给服务器，服务器更新feedId对应的状态
     *
     * @see SzSns.prototype.sendFeed
     * @param feedId
     * @param feedDefId
     * @param feedInfo
     * @param platformId
     * <pre>
     *    ｛
     *          name:[param, param, ...],
     *          caption:[param, param, ...],
     *          description:[param, param, ...],
     *          picture:图片在社区照片墙上的id,
     *     ｝
     * </pre>
     */
    SzSnsOgz.prototype.sendFeed = function(feedId, feedDefId, feedInfo, platformId) {
        feedDefId = feedDefId.toString();
        var feedUrl = SZ.CANVAS_URL + '/?feedId=' + feedId + '&platformId=' + platformId+ '&act=feed&fb_source=feed';
        // 防止文字超框
        var link_name = SzLib.strReplace(SZ.FEED_JSON[feedDefId].title, feedInfo.name);
        if (link_name.length > 20) {
            link_name = link_name.substring(0, 15) + '...';
        }
        SzLib.log('feedDefId:' + feedDefId.toString());
        SzLib.log('Typeof feedDefId:' + typeof(feedDefId));

        // TODO 根据feed 类型 使用不同的图片
        var feedType = feedDefId.slice(0,2);
        var pic = 'default';
        switch (feedType) {
            case 8:
                pic = 'stall';
                break;
            case 11:
            case 26:
                pic = 'default';
                break;
            case 21:
                pic = 'expand';
                break;
            case 22:
                pic = 'table';
                break;
            case 23:
                pic = 'npc';
                break;
            case 24:
            case 25:
                pic = 'mastery';
                break;
            case 27:
            case 28:
                pic = 'customer';
                break;
            case 29:
                pic = 'pet';
                break;
            default:
                break;
        }

        var params = {
            'link_name': link_name,
            'title': SzLib.strReplace(SZ.FEED_JSON[feedDefId].caption, feedInfo.caption),
            'message': SzLib.strReplace(SZ.FEED_JSON[feedDefId].description, feedInfo.description),
            'link_params' : {
                'feedId': feedId,
                'platformId': platformId,
                'act': 'feed',
                'fb_source': 'feed'
            },
            'picture' : pic
        };
        SzLib.log('params:' + JSON.stringify(params));

        $("#gameSwf").addClass("hideSwf");
        $("#gameImage")
            .html('<img src="data:image/jpeg;base64,' + SZ.APP.callAsFunc("getStageImage", []) + '" width="100%">')
            .show();

        OGZ.streamPost(params);
    };

    /**
     * 前端调用sendRequest接口，当真正发送request后，在回调函数中调用as接口，
     * 前端记录已发送request的类型和已发送的userId，并调用后端接口，
     * 后端根据userId创建request数据
     *
     * @see SzSns.prototype.sendRequest
     * @param userIds
     * @param requestDefId
     * @param requestInfo
     * <pre>
     *    ｛
     *          title:[param, param, ...],
     *          message:[param, param, ...],
     *     ｝
     * </pre>
     */
    SzSnsOgz.prototype.sendRequest = function(userIds, requestDefId, requestInfo) {
         $("#gameSwf").addClass("hideSwf");
         $("#gameImage")
             .html('<img src="data:image/jpeg;base64,' + SZ.APP.callAsFunc("getStageImage", []) + '" width="100%">')
             .show();

         var params = {
            'message': SzLib.strReplace(SZ.REQUEST_JSON[requestDefId].message, requestInfo.message),
             'data': '',
             'target': {
                 'uids': userIds
             }
         };
        SzLib.log(JSON.stringify(params));
        OGZ.showRequest(params);


        // $("#gameSwf").addClass("hideSwf");
        // $("#gameImage")
        //     .html('<img src="data:image/jpeg;base64,' + SZ.APP.callAsFunc("getStageImage", []) + '" width="100%">')
        //     .show();
        //
        // $.each(userIds, function(key, userId) {
        //     SzLib.log(userId);
        //     VK.callMethod("showRequestBox", parseInt(userId), SzLib.strReplace(SZ.REQUEST_JSON[requestDefId].message, requestInfo.message));
        //     VK.addCallback("onRequestSuccess", function(res) {
        //         SzLib.log(res);
        //         $("#gameSwf").removeClass("hideSwf");
        //         $("#gameImage").html("").hide();
        //         SZ.APP.callAsFunc("sendRequestCallBack", [res.request]);
        //     });
        //     VK.addCallback("onRequestFail", function(res) {
        //         SzLib.log(res);
        //         $("#gameSwf").removeClass("hideSwf");
        //         $("#gameImage").html("").hide();
        //         SZ.APP.callAsFunc("sendRequestCallBack", ['false']);
        //     });
        //     VK.addCallback("onRequestCancel", function(res) {
        //         SzLib.log(res);
        //         $("#gameSwf").removeClass("hideSwf");
        //         $("#gameImage").html("").hide();
        //         SZ.APP.callAsFunc("sendRequestCallBack", ['false']);
        //     });
        // });
    };

    /**
     * 发送sendOpenGraph接口，
     *
     * @see SzSns.prototype.sendOpenGraph
     * @param actionType // e.g: harvest
     * @param objectType // e.g: flower
     * @param graphInfo // json string e.g: [[title,...], [description,...]], 具体需要参考openGraph的文档进行设置，默认为空“[[],[]]”
     */
    SzSnsOgz.prototype.sendOpenGraph = function(actionType, objectType, graphInfo) {
        // 无
    };

    /**
     * @see SzSns.prototype.orderPayment
     */
    SzSnsOgz.prototype.orderPayment = function(paymentDefId, extra) {
         var params = {
             item: paymentDefId,
             additional: JSON.stringify(extra)  // [activityId, activityType]
         };
         if ($("#gameShadow").is(":hidden")) {
             $("#gameSwf").addClass("hideSwf");
             $("#gameImage")
                 .html('<img src="data:image/jpeg;base64,' + SZ.APP.callAsFunc("getStageImage", []) + '" width="100%">')
                 .show();
         }
         SzLib.log('*********************');
         SzLib.log('params;' + JSON.stringify(params));
         OGZ.showPayment(params);
        // VK.callMethod("showOrderBox", params);
        // VK.addCallback('onOrderSuccess', function(res) {
        //     if ($("#gameShadow").is(":hidden")) {
        //         $("#gameSwf").removeClass("hideSwf");
        //         $("#gameImage").html("").hide();
        //     }
        //
        //     SzLib.sendSzReq(
        //         ["page.index", []],
        //         function(r) {
        //             SzLib.log(r);
        //             SZ.APP.paymentSucceed(r);
        //         },
        //         function(r) {
        //             SzLib.log(r);
        //         },
        //         $.extend(addParams, {
        //             "act": "complete",
        //             "res": res,
        //             "auth_key": SZ.PF_TOKEN,
        //             "viewer_id": SZ.PLATFORM_ID,
        //             "token": SZ.TOKEN
        //         }),
        //         SZ.IS_COMPRESS
        //     );
        // });
        // VK.addCallback('onOrderFail', function(r) {
        //     if ($("#gameShadow").is(":hidden")) {
        //         $("#gameSwf").removeClass("hideSwf");
        //         $("#gameImage").html("").hide();
        //     }
        // });
        // VK.addCallback('onOrderCancel', function(r) {
        //     if ($("#gameShadow").is(":hidden")) {
        //         $("#gameSwf").removeClass("hideSwf");
        //         $("#gameImage").html("").hide();
        //     }
        // });
    };

    /**
     * 打开邀请好友界面
     *
     * @returns void
     */
    SzSnsOgz.prototype.inviteBox = function() {
         SzLib.log('sina invite box');
         SZ.APP.callAsFunc("closeJsPanel", []);
         SZ.APP.callAsFunc("openInviteNeighborsPanel", []);
    };

    return new SzSnsOgz();

});